package pe.com.bbva.carga.bo.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import pe.com.bbva.carga.bo.ArchivoBO;
import pe.com.bbva.carga.bo.LoadClassTargpsBO;
import pe.com.bbva.carga.bo.ProcesoCargaBO;
import pe.com.bbva.carga.dao.LoadClassTargpsDAO;
import pe.com.bbva.carga.domain.Archivo;
import pe.com.bbva.carga.domain.ArchivoCarga;
import pe.com.bbva.carga.domain.Proceso;
import pe.com.bbva.carga.domain.ProcesoCarga;
import pe.com.bbva.configuracion.bo.ConfiguracionBO;
import pe.com.bbva.configuracion.bo.TurnoBO;
import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.Fecha;
import pe.com.stefanini.core.util.FechaUtil;

@Service("loadClassTargpsBO")
public class LoadClassTargpsBOImpl implements LoadClassTargpsBO {

	Logger logger = Logger.getLogger(this.getClass());

	@Resource
	private LoadClassTargpsDAO loadClassTargpsDAO;
	
	@Resource
	private ArchivoBO archivoBO;
	
	@Resource
	private ProcesoCargaBO procesoCargaBO;
	
	@Resource
	private ConfiguracionBO configuracionBO;
	
	@Resource
	private TablaBO tablaBO;
	
	@Resource
	private TurnoBO turnoBO;
	
	public void cargarArchivo(ArchivoCarga archivoCarga) throws BOException {
		Archivo archivo = new Archivo();
		ProcesoCarga procesoCarga = null;
		try {
			if (archivoCarga.getIdProceso() == null) {
				procesoCarga = obtenerProcesoCarga(archivoCarga);
				archivoCarga.setIdProceso(procesoCarga.getId());
			}
			String tipoCarga = "ESTAMPACION";
			if(archivoCarga.getIdTipoArchivo().equals(Constantes.RETORNO)){
				tipoCarga = "RETORNO";
			}else if(archivoCarga.getIdTipoArchivo().equals(Constantes.FALTANTES)){
				tipoCarga = "FALTANTES";
			}
			Archivo buscar = new Archivo();
			buscar.setIdProceso(archivoCarga.getIdProceso());
			buscar.setTipo(String.valueOf(archivoCarga.getIdTipoArchivo()));
			List<Archivo> listaArchivo = archivoBO.findArchivos(buscar);
			if(listaArchivo!=null && !listaArchivo.isEmpty()){
				archivo = listaArchivo.get(0);
				archivo.setNombreArchivo(archivoCarga.getNombreArchivo());
				archivo.setEstadoCarga(String.valueOf(Constantes.ESTADO_CARGA_EXITO));
			}else{
				archivo = getCargaArchivo(archivoCarga);
			}
			Tabla tablaArchivo = tablaBO.findTablaById(archivoCarga.getIdEquipo());
			archivo.setComentario("ARCHIVO DE " + tipoCarga + " DE " + tablaArchivo.getDescripcion() + ", CARGADO CON EXITO");
			archivoBO.save(archivo);
			String respuesta = loadClassTargpsDAO.cargarArchivo(archivoCarga);
			if(respuesta!=null && !respuesta.equals("")){
				archivo = archivoBO.findById(archivo.getId());
				archivo.setFechaCargaFinal(FechaUtil.getFechaActualDate());
				archivoBO.save(archivo);
			}else{
				Tabla incidenciaValor = tablaBO.findById(Constantes.I0003);
				configuracionBO.enviarEmailError(String.valueOf(incidenciaValor.getValor()), incidenciaValor.getDescripcion());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public List<Proceso> findFechaProcesoPendiente(Long idConfiguracion) throws BOException {
		try {
			return loadClassTargpsDAO.findFechaProcesoPendiente(idConfiguracion);
		} catch (DAOException e) {
			e.printStackTrace();
			throw new BOException(e.getMessage());
		}
	}

	public Archivo getCargaArchivo(ArchivoCarga archivoCarga) {
		Archivo archivo = new Archivo();
		try {
			Date fechaActual = Fecha.ObtenerFechaActual();
			if(archivoCarga.getId()!=null)
				archivo.setId(archivoCarga.getId());
			archivo.setIdProceso(archivoCarga.getIdProceso());
			archivo.setEstado(Constantes.ESTADO_ACTIVO);
			archivo.setFechaCargaInicial(fechaActual);
			archivo.setFormaCarga(archivoCarga.getIdTipoCarga().toString());
			archivo.setNombreArchivo(archivoCarga.getNombreArchivo());
			archivo.setIdProveedor(archivoCarga.getIdProveedor());
			archivo.setTipo(archivoCarga.getIdTipoArchivo().toString());
			archivo.setCodUsuarioCreacion("ADMIN");
			archivo.setFechaCreacion(fechaActual);
		} catch (Exception e) {
			archivo.setEstadoCarga(String.valueOf(Constantes.ESTADO_CARGA_FALLIDO));
		}
		return archivo;
	}

	private ProcesoCarga obtenerProcesoCarga(ArchivoCarga archivoCarga) {
		ProcesoCarga proceso = null;
		List<ProcesoCarga> lstProcesoCarga = null;
		ProcesoCarga procesoCargaBus = new ProcesoCarga();
		try {
			procesoCargaBus.setTurno(turnoBO.findById(archivoCarga.getIdTurno()));
			procesoCargaBus.setFechaProceso(archivoCarga.getFechaProceso());
			procesoCargaBus.setEquipo(tablaBO.findById(archivoCarga.getIdEquipo()));
			lstProcesoCarga = procesoCargaBO.findProcesosCarga(procesoCargaBus);
			if (lstProcesoCarga.size() == 0) {
				procesoCargaBus.setEstadoFacturacion("0");
				procesoCargaBus.setFormaFacturacion(archivoCarga.getIdTipoCarga().toString());
				procesoCargaBus.setCodUsuarioCreacion("ADMIN");
				procesoCargaBus.setFechaCreacion(FechaUtil.getFechaActualDate());
				procesoCargaBO.save(procesoCargaBus);
				proceso = procesoCargaBus;
			} else {
				proceso = lstProcesoCarga.get(0);
			}
		} catch (Exception e) {
		}
		return proceso;
	}

	public List<String> consolidarCarga(Long idTurno, String fechaProceso) {
		try {
			List<String> lstEquipos = new ArrayList<String>();
			lstEquipos = procesoCargaBO.consolidarCarga(idTurno, fechaProceso);
			return lstEquipos;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			return null;
		}
	}
}